package com.app.studyroom;

import android.os.Bundle;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.appcompat.app.AppCompatActivity;

import com.app.studyroom.peripherals.icCardRead.CardReaderGuard;

/** 全局基类：沉浸式 + HID 读卡器按键统一拦截 */
public abstract class BaseActivity extends AppCompatActivity {

    /* 焦点黑洞：抢走硬键盘焦点避免控件高亮 */
    private View focusStealer;

    /* ───────── 生命周期 ───────── */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (enableImmersiveMode()) hideSystemUI();       // 保持沉浸式
    }

    /** layout 加载完毕后插入透明 1×1 View */
    @Override
    public void onContentChanged() {
        super.onContentChanged();
        if (focusStealer == null) {
            focusStealer = new View(this);
            focusStealer.setFocusable(true);
            focusStealer.setFocusableInTouchMode(true);
            focusStealer.setAlpha(0f);                   // 透明但 VISIBLE

            ((ViewGroup) findViewById(android.R.id.content))
                    .addView(focusStealer,
                            new ViewGroup.LayoutParams(1, 1));
        }
    }

    /** App 恢复前台时再次隐藏状态栏/导航栏 */
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && enableImmersiveMode()) hideSystemUI();
    }

    /* ───────── 键盘事件统一拦截 ───────── */
    @Override
    public boolean dispatchKeyEvent(KeyEvent ev) {

        /* 只处理物理键盘事件（HID 读卡器） */
        boolean fromPhysical = ev.getDevice()!=null
                && (ev.getDevice().getSources() & InputDevice.SOURCE_KEYBOARD) != 0
                && !ev.getDevice().isVirtual();

        if (fromPhysical) {

            /* 1. 刷卡模式放行：让 Dialog 的 EditText 正常收数字 */
            if (CardReaderGuard.isReadingCard)
                return super.dispatchKeyEvent(ev);

            /* 2. 非刷卡模式 ⇒ 抢焦点 + 吞掉数字/回车 */
            int code = ev.getKeyCode();
            boolean isDigit = (code >= KeyEvent.KEYCODE_0 && code <= KeyEvent.KEYCODE_9)
                    || (code >= KeyEvent.KEYCODE_NUMPAD_0 && code <= KeyEvent.KEYCODE_NUMPAD_9);
            boolean isEnter = code == KeyEvent.KEYCODE_ENTER || code == KeyEvent.KEYCODE_NUMPAD_ENTER;

            if (isDigit || isEnter) {
                stealFocus();       // 把焦点给隐藏 View，控件不再高亮
                return true;        // 事件到此为止
            }
        }
        return super.dispatchKeyEvent(ev);               // 其余正常分发
    }

    /* ───────── 私有工具 ───────── */
    private void stealFocus() {
        if (focusStealer != null) {
            focusStealer.requestFocus();
            if (!focusStealer.hasFocus()) {              // 兜底
                focusStealer.clearFocus();
                focusStealer.requestFocus();
            }
        }
    }

    /** 子类可覆盖决定是否需要沉浸式 */
    protected boolean enableImmersiveMode() { return true; }

    /** 隐藏状态栏 / 导航栏（沉浸式） */
    protected void hideSystemUI() {
        View decor = getWindow().getDecorView();
        decor.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
    }
}
